import { Context, Next } from 'koa';
import serve from 'koa-static';
import * as path from 'path';
import * as fs from 'fs';

// 404 页面 HTML
const notFoundHtml = `<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>404 - 页面未找到</title>
  <style>
    * { margin: 0; padding: 0; box-sizing: border-box; }
    body {
      font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
      background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
      display: flex;
      justify-content: center;
      align-items: center;
      min-height: 100vh;
      color: #333;
    }
    .container {
      text-align: center;
      background: white;
      padding: 60px 40px;
      border-radius: 20px;
      box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
      max-width: 500px;
    }
    h1 {
      font-size: 120px;
      font-weight: 700;
      color: #667eea;
      margin-bottom: 20px;
      line-height: 1;
    }
    h2 {
      font-size: 28px;
      margin-bottom: 20px;
      color: #333;
    }
    p {
      font-size: 16px;
      color: #666;
      margin-bottom: 30px;
      line-height: 1.6;
    }
    .btn {
      display: inline-block;
      padding: 12px 30px;
      background: #667eea;
      color: white;
      text-decoration: none;
      border-radius: 25px;
      transition: all 0.3s;
      font-size: 16px;
      margin: 0 10px;
    }
    .btn:hover {
      background: #5568d3;
      transform: translateY(-2px);
      box-shadow: 0 5px 15px rgba(102, 126, 234, 0.4);
    }
  </style>
</head>
<body>
  <div class="container">
    <h1>404</h1>
    <h2>页面未找到</h2>
    <p>抱歉，您访问的页面不存在。</p>
    <div>
      <a href="/web/" class="btn">返回首页</a>
    </div>
  </div>
</body>
</html>`;

// 获取目录路径
const publicDir = path.join(__dirname, '../../public');
const webDir = path.join(publicDir, 'web');
const adminDir = path.join(publicDir, 'admin');

/**
 * 根路径处理中间件：默认重定向到 web 路由
 */
export function rootPathMiddleware(ctx: Context, next: Next): Promise<void> {
  if (ctx.path === '/' || ctx.path === '') {
    // 检查 web 目录是否存在
    const webIndexPath = path.join(webDir, 'index.html');
    if (fs.existsSync(webDir) && fs.existsSync(webIndexPath)) {
      // web 项目存在，重定向到 /web/
      ctx.status = 301; // 永久重定向
      ctx.redirect('/web/');
      return Promise.resolve();
    } else {
      // web 项目不存在，返回 404
      ctx.status = 404;
      ctx.type = 'text/html; charset=utf-8';
      ctx.body = notFoundHtml.replace(
        '<p>抱歉，您访问的页面不存在。</p>',
        '<p>抱歉，您访问的页面不存在或 Web 端项目尚未部署。</p>'
      );
      return Promise.resolve();
    }
  }
  return next();
}

/**
 * Web 端静态文件服务中间件（支持 SPA 路由 fallback）
 */
export function webStaticMiddleware(ctx: Context, next: Next): Promise<void> {
  if (!fs.existsSync(webDir)) {
    return next();
  }

  if (ctx.path.startsWith('/web/')) {
    // 保存原始路径
    const originalPath = ctx.path;
    // 修改路径为相对于 webDir 的路径
    ctx.path = ctx.path.replace('/web', '');
    if (ctx.path === '' || ctx.path === '/') {
      ctx.path = '/index.html';
    }

    // 创建静态文件服务实例
    const webStatic = serve(webDir);
    
    // 调用静态文件服务
    return webStatic(ctx, async () => {
      // 如果静态文件服务没有设置响应体（文件不存在），返回 index.html（SPA fallback）
      if (!ctx.body) {
        const webIndexPath = path.join(webDir, 'index.html');
        if (fs.existsSync(webIndexPath)) {
          ctx.status = 200;
          ctx.type = 'text/html';
          ctx.body = fs.readFileSync(webIndexPath, 'utf-8');
        }
      }
    }).then(() => {
      // 恢复原始路径
      ctx.path = originalPath;
    });
  }

  return next();
}

/**
 * Admin 端静态文件服务中间件（支持 SPA 路由 fallback）
 */
export function adminStaticMiddleware(ctx: Context, next: Next): Promise<void> {
  if (!fs.existsSync(adminDir)) {
    return next();
  }

  if (ctx.path.startsWith('/admin/')) {
    // 保存原始路径
    const originalPath = ctx.path;
    // 修改路径为相对于 adminDir 的路径
    ctx.path = ctx.path.replace('/admin', '');
    if (ctx.path === '' || ctx.path === '/') {
      ctx.path = '/index.html';
    }

    // 创建静态文件服务实例
    const adminStatic = serve(adminDir);
    
    // 调用静态文件服务
    return adminStatic(ctx, async () => {
      // 如果静态文件服务没有设置响应体（文件不存在），返回 index.html（SPA fallback）
      if (!ctx.body) {
        const adminIndexPath = path.join(adminDir, 'index.html');
        if (fs.existsSync(adminIndexPath)) {
          ctx.status = 200;
          ctx.type = 'text/html';
          ctx.body = fs.readFileSync(adminIndexPath, 'utf-8');
        }
      }
    }).then(() => {
      // 恢复原始路径
      ctx.path = originalPath;
    });
  }

  return next();
}

/**
 * 404 处理中间件
 */
export function notFoundMiddleware(ctx: Context): void {
  if (ctx.path.startsWith('/api/')) {
    // API 路由 404
    ctx.status = 404;
    ctx.body = {
      code: 404,
      msg: '接口不存在',
      data: {},
      requestId: ctx.state.requestId || '',
    };
  } else {
    // 非 API 路由 404（前端路由未匹配或文件不存在）
    ctx.status = 404;
    ctx.type = 'text/html; charset=utf-8';
    ctx.body = notFoundHtml;
  }
}

